#include "paginator.h"
#include <QHBoxLayout>
#include <QLabel>

Paginator::Paginator(int pageCount, QWidget *parent)
    : QWidget{parent}
{
    // 设置页数
    this->pageCount = pageCount;
    // 设置尺寸
    this->setMinimumSize(1270, 32);
    // 创建水平布局
    QHBoxLayout* layout = new QHBoxLayout();
    this->setLayout(layout);
    layout->setContentsMargins(0, 0, 3, 0);
    layout->setSpacing(8);

    // 创建分页器内部按钮
    // 创建上一页按钮
    prevPageBtn = new QPushButton();
    prevPageBtn->setIcon(QIcon(":/images/admin/arrow-left.png"));
    setBtnStyle(prevPageBtn);

    // 创建下一页按钮
    nextPageBtn = new QPushButton();
    nextPageBtn->setIcon(QIcon(":images/admin/arrow-right.png"));
    setBtnStyle(nextPageBtn);

    // 创建中间页面按钮
    if(pageCount <= 7)
    {
        for(int i = 0; i < pageCount; i++)
        {
            PageButton* pageBtn = new PageButton(i);
            if(i == 1)
            {
                pageBtn->setActive(true);
            }
            pageBtns.push_back(pageBtn);
        }
    }
    else
    {
        for(int i = 1; i <= 5; i++)
        {
            PageButton* pageBtn = new PageButton(i);
            if(i == 1)
            {
                pageBtn->setActive(true);
            }
            pageBtns.push_back(pageBtn);
        }

        // 添加 ... 按钮
        PageButton* foldedBtn = new PageButton(0);
        foldedBtn->setFolded(true);
        pageBtns.push_back(foldedBtn);

        // 添加最后一页按钮
        PageButton* lastBtn = new PageButton(pageCount);
        pageBtns.push_back(lastBtn);
    }

    // 创建输入框，显示页码
    pageEdit = new QLineEdit();
    pageEdit->setFixedSize(QSize(48, 32));
    pageEdit->setAlignment(Qt::AlignCenter);
    pageEdit->setStyleSheet("QLineEdit{"
                            "background-color: #FFFFFF;"
                            "border: 1px solid #D9D9D9;"
                            "border-radius: 2px;"
                            "padding-left: 12px;");

    // 创建两个 QLabel 显示文字
    QLabel* jumpToLabel = new QLabel("跳至");
    QLabel* pageLabel = new QLabel("页");

    // 布局设置
    layout->addStretch(); // 增加一个空白区域

    layout->addWidget(prevPageBtn);
    for(int i = 0; i < pageBtns.size(); i++)
    {
        layout->addWidget(pageBtns[i]);
    }
    layout->addWidget(nextPageBtn);
    layout->addWidget(jumpToLabel);
    layout->addWidget(pageEdit);
    layout->addWidget(pageLabel);

    initSignalAndSlots();
}

void Paginator::setBtnStyle(QPushButton *btn)
{
    btn->setIconSize(QSize(12, 12));
    btn->setFixedSize(QSize(32, 32));
    btn->setStyleSheet("QPushButton {"
                       "color: #000000; "
                       "background-color: #FFFFFF; "
                       "border: 1px solid #D9D9D9; "
                       "border-radius: 2px;}");
}

void Paginator::jumpToPage(int page)
{
    if (page < 1 || page > pageCount)
        return;

    if(pageCount <= 7)
    {
        currentPage = page;
        for(auto* pageBtn : pageBtns)
        {
            pageBtn->setActive(false);
        }
        pageBtns[currentPage - 1]->setActive(true);
    }
    else
    {
        if(page <= 5)
        {
            jumpToPageCase1(page);
        }
        else if(page >= pageCount - 4)
        {
            jumpToPageCase2(page);
        }
        else
        {
            jumpToPageCase3(page);
        }

        currentPage = page;
    }
    emit this->pageChanged(currentPage);
}

void Paginator::initSignalAndSlots()
{
    // 处理上一页、下一页
    connect(prevPageBtn, &QPushButton::clicked, this, &Paginator::prevPage);
    connect(nextPageBtn, &QPushButton::clicked, this, &Paginator::nextPage);
    // 处理所有页码按钮
    for(auto* pageBtn : pageBtns)
    {
        connect(pageBtn, &QPushButton::clicked, this, &Paginator::pageBtnClicked);
    }

    // 处理输入框
    connect(pageEdit, &QLineEdit::returnPressed, this, [=](){
        int page = pageEdit->text().toInt();
        if(page < 1)
            page = 1;
        if(page > pageCount)
            page = pageCount;
        this->jumpToPage(page);
    });
}

void Paginator::jumpToPageCase1(int page)
{
    pageBtns[0]->setPage(1);
    pageBtns[1]->setPage(2);
    pageBtns[2]->setPage(3);
    pageBtns[3]->setPage(4);
    pageBtns[4]->setPage(5);
    pageBtns[5]->setPage(6);
    pageBtns[6]->setPage(pageCount);

    for(int i = 0; i < pageBtns.size(); i++)
    {
        if(pageBtns[i]->getPage() == page)
        {
            pageBtns[i]->setActive(true);
        }
        else
        {
            pageBtns[i]->setActive(false);
        }

        if(i == 5)
        {
            pageBtns[i]->setFolded(true);
        }
        else
        {
            pageBtns[i]->setFolded(false);
        }
    }
}

void Paginator::jumpToPageCase2(int page)
{
    pageBtns[0]->setPage(1);
    pageBtns[1]->setPage(pageCount - 5);
    pageBtns[2]->setPage(pageCount - 4);
    pageBtns[3]->setPage(pageCount - 3);
    pageBtns[4]->setPage(pageCount - 2);
    pageBtns[5]->setPage(pageCount - 1);
    pageBtns[6]->setPage(pageCount);

    for(int i = 0; i < pageBtns.size(); i++)
    {
        if(pageBtns[i]->getPage() == page)
        {
            pageBtns[i]->setActive(true);
        }
        else
        {
            pageBtns[i]->setActive(false);
        }

        if(i == 1)
        {
            pageBtns[i]->setFolded(true);
        }
        else
        {
            pageBtns[i]->setFolded(false);
        }
    }

}

void Paginator::jumpToPageCase3(int page)
{
    pageBtns[0]->setPage(1);
    pageBtns[1]->setPage(page - 2);
    pageBtns[2]->setPage(page - 1);
    pageBtns[3]->setPage(page);
    pageBtns[4]->setPage(page + 1);
    pageBtns[5]->setPage(page + 2);
    pageBtns[6]->setPage(pageCount);

    for(int i = 0; i < pageBtns.size(); i++)
    {
        if(i == 3)
        {
            pageBtns[i]->setActive(true);
        }
        else
        {
            pageBtns[i]->setActive(false);
        }

        if(i == 1 || i == 5)
        {
            pageBtns[i]->setFolded(true);
        }
        else
        {
            pageBtns[i]->setFolded(false);
        }
    }
}

void Paginator::prevPage()
{
    if(currentPage == 1)
        return;
    jumpToPage(currentPage - 1);
}

void Paginator::nextPage()
{
    if(currentPage == pageCount)
        return;
    jumpToPage(currentPage + 1);
}

void Paginator::pageBtnClicked()
{
    int page = static_cast<PageButton*>(sender())->getPage();
    jumpToPage(page);
}
